package la.iok.hzsvn.lewin.movie.operation.mapper;

import la.iok.hzsvn.lewin.movie.operation.entity.PlayRecord;
import la.iok.hzsvn.lewin.mybatis.mapper.BaseMapper;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.Collection;
import java.util.Date;
import java.util.List;

public interface PlayRecordMapper extends BaseMapper<PlayRecord> {
    /**
     * 设备关联的正在播放的播放记录或者正在结束播放的播放记录
     * @param deviceId 设备id
     * @return 播放记录列表
     */
    @Nullable
    List<PlayRecord> devicePlayingRecord(@NotNull Long deviceId);

    @NotNull
    @NotNullElement
    List<PlayRecord> roomPlayingRecord(@NotNull Long roomId);

    /**
     * 用户关联的正在播放的播放记录或者正在结束播放的播放记录
     * @param userId 用户id
     * @return 播放记录列表
     */
    List<PlayRecord> userPlayingRecord(@NotNull Long userId,@NotNull Long orgUnitId);

    /**
     * 结束开本记录
     * @param pr 开本记录
     * @return 修改记录数，成功应该返回1。失败返回0
     */
    int end(PlayRecord pr);

    List<PlayRecord> list(String orderColumn, String order,Long playerId, Collection<Long> orgUnitIds,Long orgUnitId, Long userId,
                          String name, Long roomId, Date start, Date end);

    Integer total(@NotNull Date start, @NotNull Date end, @Nullable List<Long> orgUnitIds);

    /**
     * 计算房间的开本次数
     * @param start 统计的开始时间
     * @param end 统计的结束时间
     * @param roomId 房间id
     * @param excludeMovieIds 需要排除的剧本id集合。有些剧本不参与返利计算
     * @return 统计的开本次数
     */
    int countPlays(@NotNull Date start, @NotNull Date end, @NotNull Long roomId, @Nullable @NotNullElement Collection<Long> excludeMovieIds);

    /**
     * 计算房间总消费额
     * @param start 统计的开始时间
     * @param end 统计的结束时间
     * @param roomId 房间id
     * @param excludeMovieIds 需要排除的剧本id集合。有些剧本不参与返利计算
     * @return 房间总消费额
     */
    Integer totalCost(@NotNull Date start, @NotNull Date end, @NotNull Long roomId, @Nullable @NotNullElement Collection<Long> excludeMovieIds);

    /**
     * 查询剧本的开本次数
     * @param movieId 剧本id
     * @param version 剧本版本,如果为空则表示任意版本
     * @return 开本次数
     */
    Integer count(Long movieId, String version);

    List<PlayRecord> need2End(int moreHours);

    /**
     * 系统自动结束超时未结束的开本记录
     * @return 受影响的开本记录数量
     */
    int endBySystem(int moreHours);

}
